package websocket

import (
	"database/sql"
	"encoding/json"
	"fmt"
	"log"
	"tuiwen-go/internal/api"
	"tuiwen-go/internal/db"
	"tuiwen-go/internal/utils"
)

var roleData struct {
	ProjectID string `json:"project_id"`
	RoleIds   string `json:"data"`
	Id        string `json:"id"`
}

// 角色任务处理程序
func taskRoleHandler(c *Client, data json.RawMessage) {
	log.Printf("客户端 %s: 正在处理角色任务, 数据: %s", c.ID, string(data))
	if err := json.Unmarshal(data, &roleData); err != nil {
		log.Printf("客户端 %s: 解析角色任务数据失败: %v", c.ID, err)
		sendMessage(c, api.WxJSONResponse{Code: -1, Msg: "无效的角色任务数据格式"})
		return
	}

	if len(roleData.ProjectID) == 0 {
		sendMessage(c, api.WxJSONResponse{Code: -1, Msg: "项目ID不能为空"})
		return
	}

	// 获取需要生成角色的文本条目
	sqlQuery := "SELECT id, textContent FROM project WHERE id = ? AND textContent IS NOT NULL"
	args := []interface{}{roleData.ProjectID}

	rows, err := db.Query(sqlQuery, args...)
	if err != nil {
		log.Printf("客户端 %s: 查询角色任务文本失败: %v", c.ID, err)
		sendMessage(c, api.WxJSONResponse{Code: -1, Msg: "查询待生成角色文本失败"})
		return
	}
	defer rows.Close()

	var textsToTranslate []struct {
		ID    int
		Split string
	}

	for rows.Next() {
		var id int
		var textContent sql.NullString
		err := rows.Scan(&id, &textContent)
		if err != nil {
			log.Printf("客户端 %s: 扫描角色任务文本行失败: %v", c.ID, err)
			continue
		}

		textsToTranslate = append(textsToTranslate, struct {
			ID    int
			Split string
		}{ID: id, Split: textContent.String})
	}

	if err = rows.Err(); err != nil {
		log.Printf("客户端 %s: 遍历角色任务文本行失败: %v", c.ID, err)
		sendMessage(c, api.WxJSONResponse{Code: -1, Msg: "处理待生成角色文本失败"})
		return
	}

	var body []struct {
		Name   string `json:"name"`
		Prompt string `json:"prompt"`
		Type   string `json:"type"`
		Remark string `json:"remark"`
	}
	// 处理每个文本条目以生成角色
	for _, item := range textsToTranslate {
		roles := ""
		// 使用 GPT API 生成角色
		generatedRoleJsonString, err := utils.CallGPTAPI("role", item.Split)
		if err != nil {
			log.Printf("客户端 %s: 调用 GPT API 生成角色失败 (ID: %d): %v", c.ID, item.ID, err)
			sendMessage(c, api.WxJSONResponse{Code: -1, Msg: fmt.Sprintf("角色生成失败 (ID: %d): %v", item.ID, err)})
			continue // 继续处理下一个文本
		} else if err := json.Unmarshal([]byte(generatedRoleJsonString), &body); err != nil {
			log.Printf("客户端 %s: 解析角色任务数据失败: %v", c.ID, err)
			sendMessage(c, api.WxJSONResponse{Code: -1, Msg: "无效的角色生成数据格式"})
			return
		}

		// 遍历每个生成的角色对象并插入数据库
		for _, role := range body {
			sqlQuery := "INSERT INTO role (name, prompt, type, remark) VALUES (?, ?, ?, ?)"
			result, err := db.Exec(sqlQuery, role.Name, role.Prompt, role.Type, role.Remark)
			if err != nil {
				log.Printf("Error inserting new role: %v", err)
				sendMessage(c, api.WxJSONResponse{Code: -1, Msg: fmt.Sprintf("角色生成失败 (ID: %d): %v", item.ID, err)})
				continue
			}
			lastID, err := result.LastInsertId()
			if err != nil {
				log.Printf("Error getting last insert ID for role: %v", err)
				sendMessage(c, api.WxJSONResponse{Code: -1, Msg: fmt.Sprintf("角色生成失败 (ID: %d): %v", item.ID, err)})
				continue
			} else {
				roles += fmt.Sprintf("%d,", lastID)

				sendMessage(c, api.WxJSONResponse{Code: 1, Msg: fmt.Sprintf("角色生成成功 (ID: %d)", item.ID), Data: map[string]interface{}{
					"id":        item.ID,
					"role_id":   lastID,
					"role_name": role.Name,
				}})
			}
		}
		// 更新文本条目，将生成的角色 ID 存储在 roles 字段中
		sqlQuery = "UPDATE project SET role_ids = ? WHERE id = ?"
		args = []interface{}{roles, item.ID}
		_, err = db.Exec(sqlQuery, args...)
		if err != nil {
			log.Printf("客户端 %s: 更新角色到项目失败 (ID: %d): %v", c.ID, item.ID, err)
			sendMessage(c, api.WxJSONResponse{Code: -1, Msg: fmt.Sprintf("更新角色到项目失败 (ID: %d): %v", item.ID, err)})
			continue
		} else {
			sendMessage(c, api.WxJSONResponse{Code: 1, Msg: fmt.Sprintf("项目挂载角色成功 (ID: %d)", item.ID)})
		}
	}
}

// 角色任务处理程序
func taskUpdateDetailRoleHandler(c *Client, data json.RawMessage) {
	log.Printf("客户端 %s: 正在处理项目详情挂载角色任务, 数据: %s", c.ID, string(data))
	if err := json.Unmarshal(data, &roleData); err != nil {
		log.Printf("客户端 %s: 解析角色任务数据失败: %v", c.ID, err)
		sendMessage(c, api.WxJSONResponse{Code: -1, Msg: "无效的角色ids任务数据格式"})
		return
	}

	if len(roleData.ProjectID) == 0 {
		sendMessage(c, api.WxJSONResponse{Code: -1, Msg: "项目ID不能为空"})
		return
	}

	// 更新文本条目，将生成的角色 ID 存储在 roles 字段中
	sqlQuery := "UPDATE text SET role_ids = ? WHERE id = ?"
	args := []interface{}{roleData.RoleIds, roleData.Id}
	_, err := db.Exec(sqlQuery, args...)
	if err != nil {
		log.Printf("客户端 %s: 更新角色到项目失败 (ID: %s): %v", c.ID, roleData.Id, err)
		sendMessage(c, api.WxJSONResponse{Code: -1, Msg: fmt.Sprintf("更新角色到项目失败 (ID: %s): %v", roleData.Id, err)})

	} else {
		sendMessage(c, api.WxJSONResponse{Code: 1, Msg: fmt.Sprintf("项目挂载角色成功 (ID: %s)", roleData.Id)})
	}

}
